package com.chagee.channel.api.bo.lark;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.annotation.JSONField;
import com.chagee.channel.api.bo.FastJsonSerializer.JsonArrayDeserializer;
import com.chagee.channel.api.enums.LarkApprovalTemplateNodeTypeEnum;
import com.chagee.channel.api.enums.LarkApprovalTemplateStatusEnum;
import com.chagee.channel.api.enums.LarkApprovalTemplateViewerTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 审核详情
 *
 * @author: chang.jiawei
 * @date: 2024/01/17
 */
@Data
@Accessors(chain = true)
public class ApprovalDetailBO implements Serializable {

    private static final long serialVersionUID = -4270355725457336331L;

    @ApiModelProperty("审批名称")
    private String approvalName;

    @ApiModelProperty("审批定义状态")
    private LarkApprovalTemplateStatusEnum status;

    @ApiModelProperty("表单详情,详见：https://open.feishu.cn/document/server-docs/approval-v4/instance/get")
    @JSONField(serializeUsing = JsonArrayDeserializer.class)
    private JSONArray form;

    @ApiModelProperty("节点信息")
    private List<ApprovalNodeDetailVO> nodeList;

    @ApiModelProperty("可见人列表")
    private List<ApproveViewerInfoDetailVO> viewers;

    @ApiModelProperty("有数据管理权限的审批流程管理员ID")
    private List<String> approvalAdminIds;

    /**
     * 节点信息
     *
     * @author: chang.jiawei
     * @date: 2024/01/17
     */
    @Data
    @Accessors(chain = true)
    public static class ApprovalNodeDetailVO implements Serializable {

        private static final long serialVersionUID = 1928279908635578774L;

        /**
         * 节点名称
         */
        @ApiModelProperty("节点名称")
        private String name;

        /**
         * 是否发起人自选节点
         */
        @ApiModelProperty("是否发起人自选节点 true - 发起审批时需要提交审批人")
        private Boolean needApprover;

        /**
         * 节点 ID
         */
        @ApiModelProperty("节点 ID")
        private String nodeId;

        /**
         * 节点自定义 ID
         */
        @ApiModelProperty("节点自定义 ID，如果没有设置则不返回")
        private String customNodeId;

        /**
         * 审批方式
         */
        @ApiModelProperty("审批方式")
        private LarkApprovalTemplateNodeTypeEnum nodeType;

        /**
         * 是否支持多选
         */
        @ApiModelProperty("是否支持多选：true-支持，发起、结束节点该值无意义")
        private Boolean approverChosenMulti;

        @ApiModelProperty("自选范围")
        private List<ApproverChosenRangeDetailVO> approverChosenRange;

        /**
         * 是否签名
         */
        @ApiModelProperty("是否签名")
        private Boolean requireSignature;
    }


    /**
     * 节点信息
     *
     * @author: chang.jiawei
     * @date: 2024/01/17
     */
    @Data
    @Accessors(chain = true)
    public static class ApproverChosenRangeDetailVO implements Serializable {

        private static final long serialVersionUID = -7005555463300147301L;
        @ApiModelProperty("指定范围：0-all，1-指定角色，2-指定人员")
        private Integer approverRangeType;

        @ApiModelProperty("根据上面的type，分别存放角色id与人员user_id，type为0时本字段为空列表")
        private List<String> approverRangeIds;
    }

    /**
     * 节点信息
     *
     * @author: chang.jiawei
     * @date: 2024/01/17
     */
    @Data
    @Accessors(chain = true)
    public static class ApproveViewerInfoDetailVO implements Serializable {

        private static final long serialVersionUID = -7005555463300147301L;
        @ApiModelProperty("可见人类型")
        private LarkApprovalTemplateViewerTypeEnum type;

        @ApiModelProperty("在可见人类型为DEPARTMENT时，id为部门的id ；在可见人类型为USER时，id为用户的id ；在可见人类型为ROLE时，id为角色的id ；在可见人类型为USER_GROUP时，id为用户组的id")
        private String id;

        @ApiModelProperty("在可见人类型为USER时，表示可见人用户id")
        private String userId;
    }


}
